#ifndef CONSTRUITMATRICE_H
#define CONSTRUITMATRICE_H

/** Fichier définissant des fontions d'aide à la création de matrices de
 * rotation.
 *
 * Dans plusieurs classe il faut initialiser des matrices de rotation, processus
 * qui peut échouer avec un lancement d'exceptions. Afin de ne pas dupliquer du
 * code inutilement ce fichier définit les fonctions qui implémentent les
 * différents mécanismes de création nécessaires.
 *
 * @file ConstruitMatrice.hpp
 * @include ConstruitMatrice.hpp Algebre/ConstruitMatrice.hpp
 *
 * @author Johan "Solo" Luisier
 * @date 2010
 */

#include "MatriceSO3.hpp"

#include "Vecteur.hpp"

#include "Utils/StatusCode.hpp"

/** Fonction qui construit la rotation à partir de l'axe Oz.
 *
 * Fonction permettant de construire une matrice de rotation à partir
 * du nouvel axe Oz. Les axes Ox et Oy sont quelconques (symétrie
 * cylindrique). On teste alors 3 possibilités existantes.
 *
 * @param[in] zPrime nouvel axe Oz, exprimé dans les coordonnées globales.
 * @param[out] mat matrice de rotation générée.
 *
 * @return StatusCode, @e true si OK, @e false sinon. Le message associé
 * donne une idée de ce qui n'est pas allé.
 */
StatusCode axeZ( const VecteurU& zPrime, MatriceSO3& mat );

/** Fonction qui construit la rotation à partir des axes Ox et Oy.
 *
 * Cette fontion permet de construire une matrice de rotation à partir des
 * nouveau axes Ox et Oy. Les deux axes donnés doivent être orthogonaux.
 *
 * @param[in] xPrime nouvel axe Ox, exprimé dans les coordonnées globales.
 * @param[in] yPrime nouvel axe Oy, exprimé dans les coordonnées globales.
 * @param[out] mat matrice de rotation générée.
 *
 * @return StatusCode, @e true si OK, @e false sinon. Le message associé donne
 * une idée de ce qui n'est pas allé.
 */
StatusCode axesXY( const VecteurU& xPrime, const VecteurU& yPrime,
                   MatriceSO3& mat );

/** Fonction qui construit la rotation à partir des axes Oy et Oz.
 *
 * Cette fontion permet de construire une matrice de rotation à partir des
 * nouveau axes Oy et Oz. Les deux axes donnés doivent être orthogonaux.
 *
 * @param[in] yPrime nouvel axe Oy, exprimé dans les coordonnées globales.
 * @param[in] zPrime nouvel axe Oz, exprimé dans les coordonnées globales.
 * @param[out] mat matrice de rotation générée.
 *
 * @return StatusCode, @e true si OK, @e false sinon. Le message associé donne
 * une idée de ce qui n'est pas allé.
 */
StatusCode axesYZ( const VecteurU& yPrime, const VecteurU& zPrime,
                   MatriceSO3& mat );


#endif // CONSTRUITMATRICE_H
